package com.suse.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.suse.dao.UserInfoDao;
import com.suse.dto.UserInfoDto;
import com.suse.pojo.UserInfo;
import com.suse.service.UserInfoService;
import com.suse.util.ResultVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Random;
import java.util.UUID;

@Service
public class UserInfoServiceImpl implements UserInfoService {
    @Resource
    UserInfoDao dao;

    // 获取邮件发送的实现类的对象
    @Autowired
    JavaMailSender javaMailSender;

    @Value("${file.address}")
    String fileAddress;
    @Autowired
    private UserInfoDao userInfoDao;

    @Override
    public ResultVo add(UserInfo u) {
        try {
            int num = dao.insert(u);
            if(num > 0) {
                return ResultVo.success("新增用户成功");
            }else {
                return ResultVo.error("新增用户失败");
            }
        }catch (Exception e) {
            e.printStackTrace();
            return ResultVo.error("数据异常");
        }
    }

    @Override
    public ResultVo update(UserInfo u) {
        try {
            int num = dao.updateById(u);
            if(num > 0) {
                return ResultVo.success("修改用户成功");
            }else {
                return ResultVo.error("修改用户失败");
            }
        }catch (Exception e) {
            e.printStackTrace();
            return ResultVo.error("数据异常");
        }
    }

    @Override
    public ResultVo del(Integer id) {
        try {
            int num = dao.deleteById(id);
            if(num > 0) {
                return ResultVo.success("删除用户成功");
            }else {
                return ResultVo.error("删除用户失败");
            }
        }catch (Exception e) {
            e.printStackTrace();
            return ResultVo.error("数据异常");
        }
    }

    @Override
    public ResultVo select(UserInfoDto dto) {
        try {
            // 条件构造器
            QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
            // 用户名模糊查询
            boolean is = null != dto.getUserName() && !"".equals(dto.getUserName());
            queryWrapper.like(is, "user_name",dto.getUserName());
            // 角色精确查询
            boolean iss = null != dto.getRole() && !"".equals(dto.getRole());
            queryWrapper.eq(iss, "role",dto.getRole());

            //创建一个分页对象
            Page<UserInfo> page = new Page<>(dto.getPage(),dto.getRow());
            // 查询所有
            Page<UserInfo> infoPage = dao.selectPage(page,queryWrapper);

            if(infoPage.getRecords().size() > 0) {
                // 构造一个Map对象
                HashMap<String,Object> map = new HashMap<>();
                // 当前页的集合
                map.put("list",infoPage.getRecords());
                // 总条数
                map.put("total",infoPage.getTotal());

                return ResultVo.success("查询成功",map);
            }else {
                return ResultVo.error("没有查询到数据");
            }
        }catch (Exception e) {
            e.printStackTrace();
            return ResultVo.error("数据异常");
        }
    }

    @Override
    public ResultVo login(UserInfo u, HttpServletRequest request) {
        // 登录查询
        QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_name",u.getUserName());
        UserInfo uu = dao.selectOne(queryWrapper);
        if(uu == null) {
            return ResultVo.error("用户不正确");
        }
        // 验证密码是否正确
        if(uu.getUserPwd().equals(u.getUserPwd())) {
            // 记录登录状态
            request.getSession().setAttribute("name",uu.getUserName());
            HashMap map=new HashMap();
            map.put("src",uu.getSrc());
            map.put("role",uu.getRole());
            return ResultVo.success("登录成功", uu.getRole());
        }
        return ResultVo.error("密码错误");
    }

    @Override
    public ResultVo sendCode(String email, HttpServletRequest request) {
        try{
            // 创建一个普通邮件对象
            SimpleMailMessage message = new SimpleMailMessage();
            // 定义一个发送者
            message.setFrom("2758578933@qq.com");
            // 定义一个收件人
            message.setTo(email);
            // 定义一个邮件的标题
            message.setSubject("人力资源管理系统登录验证码");
            Random rd = new Random();
            int code = rd.nextInt(10000);
            // 定义邮件正文
            message.setText("你的登录验证码是：" + code);
            // 发送邮件
            javaMailSender.send(message);
            // 把验证码存入到session中
            request.getSession().setAttribute("code",code);
            return ResultVo.success("验证码发送成功");
        }catch (Exception e) {
            e.printStackTrace();
            return ResultVo.error("验证码发送失败");
        }
    }

    @Override
    public ResultVo loginCode(String code, HttpServletRequest request) {
        // 获取session的验证码
        String c = request.getSession().getAttribute("code") +"";
        if(c.equals(code)) {
            return ResultVo.success("验证码登录成功");
        }
        return ResultVo.error("验证码不正确");
    }

    @Override
    public ResultVo fileUpload(MultipartFile file, HttpServletRequest request) {
        try{
            // 1. 更改文件的前缀信息
            String fullName = file.getOriginalFilename();
            // 获取文件的后缀: 例如.jpg
            String b = fullName.substring(fullName.indexOf(".") + 1);
            // 保持文件名的唯一性
            String uuid = UUID.randomUUID() + "";
            // 定义新的文件名
            String newFile = uuid + "." + b;
            System.out.println("newFile = " + newFile);
            // 2. 定义一个以实践命名的文件目录: 2024-01-06
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            String newDir = format.format(new Date());
            // 3. 创建一个文件对象
            File f =new File(fileAddress + "/" + newDir + "/" + newFile);
            if(!f.isDirectory()) {
                // 创建目录
                f.mkdirs();
            }
            // 4. 将文件上传到指定目录
            file.transferTo(f);
            System.out.println("文件上传成功");
            // 记录一个访问图片的服务器的路径
            String imgSrc = "/upload/" + newDir + "/" + newFile;
            HashMap<String,Object> map = new HashMap<>();
            if(b.equals("mp4")) {
                map.put("type","video");
                map.put("src",imgSrc);
            }else {
                map.put("type","image");
                map.put("src",imgSrc);
            }
            System.out.println("imgSrc = " + imgSrc);
//             根据用户名修改图片地址
            String userName =  request.getSession().getAttribute("userName") + "";
                QueryWrapper<UserInfo> u = new QueryWrapper<>();
                u.eq("user_name",userName);
                UserInfo user = new UserInfo();
                dao.update(user,u);
                return ResultVo.success("success",map);
//            if(userName == null) {
//                  return ResultVo.error("用户名为空");
//            }
//            userInfoDao.updateSrcByUserName(imgSrc,userName);
//            return ResultVo.success("success",map);
        }catch (Exception e) {
            e.printStackTrace();
            return ResultVo.error("文件上传失败");
        }
    }
}